/**
 * <b>项目名称：</b>网络应用框架<br/>
 * <b>包    名：</b>com.hhwy.framework.util<br/>
 * <b>文 件 名：</b>JsonToBean.java<br/>
 * <b>版本信息：</b><br/>
 * <b>日    期：</b>2014年7月25日-下午2:11:33<br/>
 * <b>Copyright (c)</b> 2014恒华伟业科技股份有限公司-版权所有<br/>
 * 
 */
package com.hhwy.framework.util;

import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.sql.Timestamp;
import java.text.ParseException;
import java.util.Iterator;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.PropertyUtilsBean;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.hhwy.framework.common.Constants;

 /**
 * <b>类 名 称：</b>JsonToBean<br/>
 * <b>类 描 述：</b>json转换成bean<br/>
 * <b>创 建 人：</b>Administrator<br/>
 * <b>修 改 人：</b>Administrator<br/>
 * <b>修改时间：</b>2014年7月25日 下午2:11:33<br/>
 * <b>修改备注：</b><br/>
 * @version 1.0.0<br/>
 */
public class JsonToBean {
	
	static PropertyUtilsBean pub = new PropertyUtilsBean(); 
	/**
	 * convert(json字符串转换成bean对象,如果json是数组则转换第一个)<br/>
	 * @param json
	 * @param clazz
	 * @return
	 * @throws InstantiationException
	 * @throws IllegalAccessException 
	 * T
	 * @throws NoSuchMethodException 
	 * @throws InvocationTargetException 
	 * @exception 
	 * @since  1.0.0
	 */
	@SuppressWarnings("unchecked")
	public static <T> T  convert(String jsonStr , Class<?> clazz) {
		Object bean = null;
		try {
			bean = clazz.newInstance();
			JSONObject json = getJSONObject(jsonStr);

			Iterator<String> it = json.keySet().iterator();
			while (it.hasNext()) {
				String key = it.next();
				PropertyDescriptor pd = pub.getPropertyDescriptor(bean, key);
				if(pd ==  null)
					continue;
				
				String value =json.getString(key);
				if(Constants.PK.equals(key) && value.length() == 0)
					continue;
				
				System.out.println("json:::key=="+key+"="+value);
				setProperty(bean, key ,pd,value);
				
			}
		} catch (Exception e) {
			throw new RuntimeException("构造实体异常！",e);
		}
		
		return (T)bean;
	}

	/**
	 * getJSONObject(描述这个方法的作用)<br/>
	 * @param jsonStr
	 * @return 
	 * JSONObject
	 * @exception 
	 * @since  1.0.0
	*/
	public static JSONObject getJSONObject(String jsonStr) {
		JSONObject json;
		Object o = JSON.parse(jsonStr);
		if(JSONArray.class.isAssignableFrom(o.getClass())){
			json = ((JSONArray)o).getJSONObject(0);
		}else
			json = (JSONObject)o;
		return json;
	}
	
	/**
	 * setProperty(给bean设置属性值)<br/>
	 * @param bean
	 * @param property
	 * @param value 
	 * void
	 * @throws InvocationTargetException 
	 * @throws IllegalAccessException 
	 * @exception 
	 * @since  1.0.0
	*/
	private static void setProperty(Object bean, String key , PropertyDescriptor pd, String value) throws Exception {
		if(value == null){
			return ;
		}
		//字符串
		if(String.class.isAssignableFrom(pd.getPropertyType())){
			
			BeanUtils.setProperty(bean, key, value);
		//日期
		}else if(Date.class.isAssignableFrom(pd.getPropertyType())){
			long l = getTime(value);
			Date d = new Date(l);
			
			BeanUtils.setProperty(bean, key, d);
		//时间戳
		}else if(Timestamp.class.isAssignableFrom(pd.getPropertyType())){
			long l = getTime(value);
			Timestamp t = new Timestamp(l);
			BeanUtils.setProperty(bean, key, t);
		//长整形
		}else if(Long.class.isAssignableFrom(pd.getPropertyType())){
			
			BeanUtils.setProperty(bean, key, Long.parseLong(value));
		//整形
		}else if(Integer.class.isAssignableFrom(pd.getPropertyType())){
			
			BeanUtils.setProperty(bean, key, Integer.parseInt(value));
		}
		
		
	}

	/**
	 * getTime(描述这个方法的作用)<br/>
	 * @param value
	 * @return 
	 * long
	 * @throws ParseException 
	 * @exception 
	 * @since  1.0.0
	*/
	private static long getTime(String value) throws ParseException {
		long l = 0;
		String t = "T";
		if(value.length() == 10){
			l = StringUtils.parse(value).getTime();
			
		}else{
			if(value.indexOf(t) > -1){
				value = value.replace(t, " ");
				l = StringUtils.parseTime(value).getTime();
			}
			
		}
		return l;
	}

}
